//
//  WBStatusListViewModel.swift
//  新浪微博
//
//  Created by 冰凌天 on 2017/8/19.
//  Copyright © 2017年 冰凌天. All rights reserved.
//

import Foundation

/// 微博数据列表视图模型
/*
 父类的选择
 
 - 如果类 需要使用 KVC 或者字典转模型框架设置的对象值, 类就需要继承自 NSObject
 - 如果 类 只是包装一些代码逻辑(写了一些函数), 可以不用任何父类, 好处: 更加轻量级
 - 提示: 如果用OC写, 一律都继承自 NSObject 即可
 
 使用: 负责微博的数据处理
 1. 字典转模型
 2. 下拉 / 上啦 刷新数据处理
 */

/// 上拉刷新最大尝试次数
fileprivate let maxPullupTryTimes = 3

class BWStatusListViewModel {
    
    /// 微博模型数组懒加载
    lazy var statusList = [BWStatus]()
    
    /// 上拉刷新错误次数
    fileprivate var pullupErrorTimes = 0
    
    /// 加载微博列表
    ///
    /// - Parameters:
    ///   - pullup: 是否上拉刷新标记
    ///   - comlpetion: 完成回调 [网络请求是否成功, 是否刷新表格]
    func loadStatus(pullup : Bool, comlpetion : @escaping (_ isSuccess : Bool, _ shouldRefresh : Bool) -> ()) {
        
        
        if pullup && pullupErrorTimes > maxPullupTryTimes {
            comlpetion(true, false)
            return
        }
        
        // since_id: 取出数组中第一条微博的 Id
        let since_id = pullup ? 0 : (statusList.first?.id ?? 0)
        // max_id: 取出数组中最后一条微博的 Id
        let max_id = !pullup ? 0 : (statusList.last?.id ?? 0)
        
        BWNetworkManager.shared.statusList(since_id: since_id, max_id: max_id) { (list, isSuccess) in
            
            // 1. 字典转模型
            guard let array = NSArray.yy_modelArray(with: BWStatus.self, json: list ?? []) as? [BWStatus] else {
                
                comlpetion(isSuccess, false)
                
                return
            }
            
            print("刷新到 \(array.count) 条数据")
            
            // 下拉刷新, 应该讲结果数组拼接在数组前面
            
            // 2. 拼接数据
            self.statusList = pullup ? self.statusList + array : array + self.statusList
            
            if pullup && array.count == 0 {
                self.pullupErrorTimes += 1;
                
                comlpetion(isSuccess, false)
                
            }else {
                
                // 3. 完成回调
                comlpetion(isSuccess, true)
            }
        }
    }
}




































